home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 247_02 / okakey.c < prev    next >
Text File  |  1989-04-17  |  2KB  |  85 lines

  1. /*
  2.  *   Program to generate OKAMOTO keys.
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include "miracl.h"
  7.  
  8. main()
  9. {  /*  calculate public and private keys  *
  10.     *  for oka encryption                 */
  11.     int n1,n2,k;
  12.     long seed;
  13.     big p,q,pq,u,u1,u2,a1,a2,b1,b2,n;
  14.     FILE *outfile;
  15.     mirsys(100,MAXBASE);
  16.     printf("random number seed = ");
  17.     scanf("%ld",&seed);
  18.     getchar();
  19.     irand(seed);
  20.     p=mirvar(0);
  21.     q=mirvar(0);
  22.     pq=mirvar(0);
  23.     u=mirvar(0);
  24.     u1=mirvar(0);
  25.     u2=mirvar(0);
  26.     a1=mirvar(0);
  27.     a2=mirvar(0);
  28.     b1=mirvar(0);
  29.     b2=mirvar(0);
  30.     n=mirvar(0);
  31.     k=0;
  32.     do
  33.     {
  34.         printf("minimum size of keys in decimal digits= ");
  35.         scanf("%d",&k);
  36.         getchar();
  37.     } while (k<30);
  38.     printf("generating keys - please wait\n");
  39.     n1=k/3+4;
  40.     n2=k/3-2;
  41.     do
  42.     { /* ensure p<<q */
  43.         strongp(q,n1);
  44.         strongp(p,n2);
  45.         premult(p,1000,pq);
  46.     } while (compare(q,pq)<=0);
  47.     multiply(p,p,u);
  48.     root(u,3,u);
  49.     subdiv(u,2,u);            /* p^(2/3) /2 */
  50.     bigrand(u,a1);
  51.     bigrand(u,a2);
  52.     bigrand(p,b1);
  53.     bigrand(p,b2);
  54.     multiply(p,q,pq);
  55.     multiply(pq,b1,u1);       
  56.     add(u1,a1,u1);            /* u1 = a1 + b1.pq */
  57.     multiply(pq,b2,u2);
  58.     add(u2,a2,u2);            /* u2 = a2 + b2.pq */
  59.     multiply(pq,p,n);
  60.     xgcd(u1,n,u,u,u);         /* u =  1/u1 mod n */
  61.     mad(u,u2,u2,n,n,u);       /* u = u2/u1 mod n */
  62.     printf("public encryption key\n");
  63.     cotnum(n,stdout);
  64.     cotnum(u,stdout);
  65.     printf("private decryption key\n");
  66.     cotnum(p,stdout);
  67.     cotnum(q,stdout);
  68.     cotnum(u1,stdout);
  69.     cotnum(u2,stdout);
  70.     WRAP=OFF;
  71.     IOBASE=60;
  72.     outfile=fopen("public.key","w");
  73.     cotnum(n,outfile);
  74.     cotnum(u,outfile);
  75.     fclose(outfile);
  76.     outfile=fopen("private.key","w");
  77.     cotnum(p,outfile);
  78.     cotnum(q,outfile);
  79.     cotnum(u1,outfile);
  80.     cotnum(u2,outfile);
  81.     fclose(outfile);
  82. }
  83.  
  84.  
  85.